package cn.xiaolang.function.test_list;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cn.xiaolang.common.utils.Monitor;

/**
 * 
 * 对list的一些操作的 测试 
 * @version 1.0
 * @since JDK1.7
 * @author fuhw
 * @date 2016年4月13日 下午2:28:33
 */
public class OptimizeList {

	/**
	 * 需求：（测试）存储两个list集合中不同元素到新的集合
	 * @author fuhw
	 * @date 2016年4月13日 下午2:26:57
	 */
	public static void test(){
		List<String> list1 = new ArrayList<>();
		for(int i=0;i<1000;i++){
			list1.add("元素"+i);
		}
		List<String> list2 = new ArrayList<>();
		for(int i=0;i<1100;i++){
			list2.add("元素"+i);
		}
		Monitor.begin();
		List<String> diffrent = getDiffrent(list1, list2);
		System.err.println(diffrent);
		Monitor.end("第一种方式：");
		System.gc();
		System.out.println("=======");
		Monitor.begin();
		List<String> diffrent2 = getDiffrent2(list1, list2);
		System.err.println(diffrent2);
		Monitor.end("第二种方式：");
	}
	/**
	 * 测试分批次处理大数据量的数据 
	 * @author fuhw
	 * @date 2016年4月13日 下午2:27:50
	 */
	public static void test2(){
		List<String> list = new ArrayList<>();
		for(int i=0;i<3000;i++){
			list.add("元素"+i);
		}
		Monitor.begin();
		batchProcess1(list,8);
		Monitor.end("第一种方式");
		Monitor.begin();
		batchProcess2(list,8);
		Monitor.end("第二种方式");
	}
	public static void main(String[] args) {
		
		test();
	}
	public static void simple() {
		List<String> list1 = new ArrayList<>();
		List<String> list2 = new ArrayList<>();
		list1.add("a");
		list1.add("b");
		list1.add("c");
		list1.add("d");
		
		list2.add("b");
		list2.add("c");
		list2.add("f");
		list2.add("g");
		List<String> diffrent = getDiffrent(list1, list2);
		for(String str:diffrent){
			System.out.println(str);
		}
		System.out.println("=======");
		List<String> diffrent2 = getDiffrent2(list1, list2);
		for(String str:diffrent2){
			System.out.println(str);
		}
	}
	
	/**
     * 
     * 优化后的（两个集合中不相同的元素组成的新集合）
     * @param list1
     * @param list2
     * @return
     * 
     * @author fuhw
     * @date 2016年4月13日 下午2:16:06
     */
	private static List<String> getDiffrent2(List<String> list1, List<String> list2) {
        List<String> diff = new ArrayList<>(list2);
        for(int i=0;i<list1.size();i++){
        	String temp = list1.get(i);
			if(list2.contains(temp)){
        		/**
        		 * 相同元素角标剔除
        		 */
        		diff.remove(diff.indexOf(temp));
        	}else{
        		diff.add(temp);
        	}
        }
        return diff;
        
    }
	
	private static List<String> getDiffrent(List<String> list1, List<String> list2) {
        Map<String,Integer> map = new HashMap<String,Integer>(list1.size()+list2.size());
        List<String> diff = new ArrayList<String>();
        List<String> maxList = list1;
        List<String> minList = list2;
        if(list2.size()>list1.size()) {
            maxList = list2;
            minList = list1;
        } else {
        	 maxList = list1;
             minList = list2;
        }
        for (String string : maxList) {
            map.put(string, 1);
        }
        for (String string : minList) {
            Integer cc = map.get(string);
            if(cc != null) {
                map.put(string, ++cc);
                continue;
            }
            map.put(string, 1);
        }
        for(Map.Entry<String, Integer> entry:map.entrySet()) {
            if(entry.getValue() == 1) {
                diff.add(entry.getKey());
            }
        }
        return diff;
        
    }
	
	
	private static void batchProcess1(List<String> list, int size){
		int num = 1 ;
		StringBuffer sBuffer = new StringBuffer();
		List<String> tempList = new ArrayList<String>(); 
		for (int i = 0; i < list.size(); i++) {
			tempList.add(list.get(i));
			if(num  % size == 0){
				//分批处理
				for(int j=0;j<tempList.size();j++){
					sBuffer.append(tempList.get(j));
				}
				System.out.println(sBuffer);
				sBuffer = new StringBuffer();
				tempList.clear();
			}
			num ++;
		}
		if(!tempList.isEmpty()) {
			for(int j=0;j<tempList.size();j++){
				sBuffer.append(tempList.get(j));
			}
			System.out.println(sBuffer);
			sBuffer = new StringBuffer();
			tempList.clear();
		}
	}
	/**
	 * 
	 * 优化的分批次处理
	 * @param list
	 * @param size
	 * 
	 * @author fuhw
	 * @date 2016年4月13日 下午2:17:05
	 */
	private static void batchProcess2(List<String> list, int size){
		StringBuffer sBuffer = new StringBuffer();
		for (int i = 0; i < list.size(); i++) {
			if((i+1)  % size == 0){
				//分批处理
				for(int j= i+1-size;j<=i;j++){
					sBuffer.append(list.get(j));
				}
				System.out.println(sBuffer);
				sBuffer = new StringBuffer();
			}
//			if(i>list.size()-size && i<list.size()){
//				if((i+1)  % size == 0){
//					//分批处理
//					for(int j=i+1;j<list.size();j++){
//						sBuffer.append(list.get(j));
//					}
//					System.out.println(sBuffer);
//					sBuffer = new StringBuffer();
//				}
//			}
			int remainder = list.size() % size;
			if(remainder != 0){
				for(int j=list.size()-remainder;j<list.size();j++){
					sBuffer.append(list.get(j));
				}
				System.out.println(sBuffer);
				sBuffer = new StringBuffer();
			}
		}
	}
}
